home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / opengl / xlib / cull.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  9.4 KB  |  379 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <GL/glx.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <X11/keysym.h>
  21.  
  22. static int attributes[] = {
  23.     GLX_RGBA,
  24.     GLX_RED_SIZE, 1,
  25.     GLX_GREEN_SIZE, 1,
  26.     GLX_BLUE_SIZE, 1,
  27.     None,
  28. };
  29.  
  30. int width = 350, height = 450;
  31.  
  32. static GLfloat cwa[2] = { 0, -1 };
  33. static GLfloat cwb[2] = { -1, .5 };
  34. static GLfloat cwc[2] = { 1, 1 };
  35. static GLfloat ccwa[2] = { 0, -1 };
  36. static GLfloat ccwb[2] = { 1, .5 };
  37. static GLfloat ccwc[2] = { -1, 1 };
  38.  
  39. static GLfloat ca[3] = { 1, 0, 0 };
  40. static GLfloat cb[3] = { 0, 1, 0 };
  41. static GLfloat cc[3] = { 0, 0, 1 };
  42.  
  43. static GLubyte ZeroBitmap[9] = {
  44.     0x1c, 0x22, 0x22, 0x32, 0x2a, 0x26, 0x22, 0x22, 0x1c,
  45. };
  46.  
  47. static GLubyte OneBitmap[9] = {
  48.     0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0c, 0x04,
  49. };
  50.  
  51. static GLubyte TwoBitmap[9] = {
  52.     0x3e, 0x20, 0x10, 0x08, 0x04, 0x02, 0x22, 0x22, 0x1c,
  53. };
  54.  
  55. static void Label(GLfloat first[2], GLfloat second[2], GLfloat third[2])
  56. {
  57.     glColor3f(1, 1, 1);
  58.     glRasterPos2fv(first);
  59.     glBitmap(8, 9, 0, 0, 0, 0, ZeroBitmap);
  60.     glRasterPos2fv(second);
  61.     glBitmap(8, 9, 0, 0, 0, 0, OneBitmap);
  62.     glRasterPos2fv(third);
  63.     glBitmap(8, 9, 0, 0, 0, 0, TwoBitmap);
  64. }
  65.  
  66. static void DrawTriangles(void)
  67. {
  68.     glPushMatrix();
  69.  
  70.     Label(cwa, cwb, cwc);
  71.     glBegin(GL_TRIANGLES);
  72.     glColor3fv(ca); glVertex2fv(cwa); 
  73.     glColor3fv(cb); glVertex2fv(cwb);
  74.     glColor3fv(cc); glVertex2fv(cwc);
  75.     glEnd();
  76.     glTranslatef(3.5, 0, 0);
  77.     Label(ccwa, ccwb, ccwc);
  78.     glBegin(GL_TRIANGLES);
  79.     glColor3fv(ca); glVertex2fv(ccwa);
  80.     glColor3fv(cb); glVertex2fv(ccwb);
  81.     glColor3fv(cc); glVertex2fv(ccwc);
  82.     glEnd();
  83.  
  84.     glTranslatef(-3.5, 3.5, 0);
  85.     Label(cwa, cwc, cwb);
  86.     glBegin(GL_TRIANGLES);
  87.     glColor3fv(ca); glVertex2fv(cwa);
  88.     glColor3fv(cc); glVertex2fv(cwc);
  89.     glColor3fv(cb); glVertex2fv(cwb);
  90.     glEnd();
  91.     glTranslatef(3.5, 0, 0);
  92.     Label(ccwa, ccwc, ccwb);
  93.     glBegin(GL_TRIANGLES);
  94.     glColor3fv(ca); glVertex2fv(ccwa);
  95.     glColor3fv(cc); glVertex2fv(ccwc);
  96.     glColor3fv(cb); glVertex2fv(ccwb);
  97.     glEnd();
  98.  
  99.     glTranslatef(-3.5, 3.5, 0);
  100.     Label(cwb, cwa, cwc);
  101.     glBegin(GL_TRIANGLES);
  102.     glColor3fv(cb); glVertex2fv(cwb);
  103.     glColor3fv(ca); glVertex2fv(cwa);
  104.     glColor3fv(cc); glVertex2fv(cwc);
  105.     glEnd();
  106.     glTranslatef(3.5, 0, 0);
  107.     Label(ccwb, ccwa, ccwc);
  108.     glBegin(GL_TRIANGLES);
  109.     glColor3fv(cb); glVertex2fv(ccwb);
  110.     glColor3fv(ca); glVertex2fv(ccwa);
  111.     glColor3fv(cc); glVertex2fv(ccwc);
  112.     glEnd();
  113.  
  114.     glTranslatef(-3.5, 3.5, 0);
  115.     Label(cwb, cwc, cwa);
  116.     glBegin(GL_TRIANGLES);
  117.     glColor3fv(cb); glVertex2fv(cwb);
  118.     glColor3fv(cc); glVertex2fv(cwc);
  119.     glColor3fv(ca); glVertex2fv(cwa);
  120.     glEnd();
  121.     glTranslatef(3.5, 0, 0);
  122.     Label(ccwb, ccwc, ccwa);
  123.     glBegin(GL_TRIANGLES);
  124.     glColor3fv(cb); glVertex2fv(ccwb);
  125.     glColor3fv(cc); glVertex2fv(ccwc);
  126.     glColor3fv(ca); glVertex2fv(ccwa);
  127.     glEnd();
  128.  
  129.     glTranslatef(-3.5, 3.5, 0);
  130.     Label(cwc, cwa, cwb);
  131.     glBegin(GL_TRIANGLES);
  132.     glColor3fv(cc); glVertex2fv(cwc);
  133.     glColor3fv(ca); glVertex2fv(cwa);
  134.     glColor3fv(cb); glVertex2fv(cwb);
  135.     glEnd();
  136.     glTranslatef(3.5, 0, 0);
  137.     Label(ccwc, ccwa, ccwb);
  138.     glBegin(GL_TRIANGLES);
  139.     glColor3fv(cc); glVertex2fv(ccwc);
  140.     glColor3fv(ca); glVertex2fv(ccwa);
  141.     glColor3fv(cb); glVertex2fv(ccwb);
  142.     glEnd();
  143.  
  144.     glTranslatef(-3.5, 3.5, 0);
  145.     Label(cwc, cwb, cwa);
  146.     glBegin(GL_TRIANGLES);
  147.     glColor3fv(cc); glVertex2fv(cwc);
  148.     glColor3fv(cb); glVertex2fv(cwb);
  149.     glColor3fv(ca); glVertex2fv(cwa);
  150.     glEnd();
  151.     glTranslatef(3.5, 0, 0);
  152.     Label(ccwc, ccwb, ccwa);
  153.     glBegin(GL_TRIANGLES);
  154.     glColor3fv(cc); glVertex2fv(ccwc);
  155.     glColor3fv(cb); glVertex2fv(ccwb);
  156.     glColor3fv(ca); glVertex2fv(ccwa);
  157.     glEnd();
  158.  
  159.     glPopMatrix();
  160. }
  161.  
  162. static void DoDisplay(void)
  163. {
  164.     glMatrixMode(GL_PROJECTION);
  165.     glLoadIdentity();
  166.     glOrtho(-0.5, width - 0.5, -0.5, height - 0.5, 0.01, 1000.0);
  167.     glMatrixMode(GL_MODELVIEW);
  168.     glLoadIdentity();
  169.  
  170.     glViewport(0, 0, width, height);
  171.     glClearColor(0.25, 0.25, 0.25, 1.0);
  172.     glClear(GL_COLOR_BUFFER_BIT);
  173.  
  174.     /* Draw flat triangles */
  175.     glShadeModel(GL_FLAT);
  176.     glTranslatef(50, 50, -10);
  177.     glScalef(20, 20, 1);
  178.     DrawTriangles();
  179.  
  180.     /* Draw smooth triangles */
  181.     glShadeModel(GL_SMOOTH);
  182.     glTranslatef(8, 0, 0);
  183.     DrawTriangles();
  184. }
  185.  
  186. static Bool WaitForMapNotify(Display *d, XEvent *e, char *arg)
  187. {
  188.     if ((e->type == MapNotify) && (e->xmap.window == (Window)arg)) {
  189.     return GL_TRUE;
  190.     }
  191.     return GL_FALSE;
  192. }
  193.  
  194. static const char* FaceName(GLenum face)
  195. {
  196.     switch (face) {
  197.       case GL_FRONT:        return "front";
  198.       case GL_BACK:        return "back";
  199.       case GL_FRONT_AND_BACK:    return "front and back";
  200.       default:            return "???";
  201.     }
  202. }
  203.  
  204. static const char* PolygonMode(GLenum mode)
  205. {
  206.     switch (mode) {
  207.       case GL_FILL:        return "fill";
  208.       case GL_POINT:        return "point";
  209.       case GL_LINE:        return "line";
  210.       default:            return "???";
  211.     }
  212. }
  213.  
  214. static const char* FrontFaceName(GLenum mode)
  215. {
  216.     switch (mode) {
  217.       case GL_CW:        return "CW";
  218.       case GL_CCW:        return "CCW";
  219.       default:            return "???";
  220.     }
  221. }
  222.  
  223. static void DisplayState(void)
  224. {
  225.     GLint frontFace, cullFace, polygonMode[2];
  226.     GLboolean cullEnabled;
  227.  
  228.     glGetIntegerv(GL_FRONT_FACE, &frontFace);
  229.     glGetIntegerv(GL_CULL_FACE_MODE, &cullFace);
  230.     glGetIntegerv(GL_POLYGON_MODE, &polygonMode[0]);
  231.     cullEnabled = glIsEnabled(GL_CULL_FACE);
  232.  
  233.     printf("PolygonMode: front=%s back=%s\n",
  234.        PolygonMode(polygonMode[0]),
  235.        PolygonMode(polygonMode[1]));
  236.     printf("CullFace: %s (%s)\n", FaceName(cullFace),
  237.        cullEnabled ? "enabled" : "disabled");
  238.     printf("FrontFace: %s\n", FrontFaceName(frontFace));
  239.     printf("\n");
  240. }
  241.  
  242. int main()
  243. {
  244.     XVisualInfo *vi;
  245.     Display *dpy;
  246.     Colormap cmap;
  247.     Window window;
  248.     XSetWindowAttributes swa;
  249.     GLXContext cx;
  250.     XEvent event;
  251.     GLboolean needDisplay;
  252.     GLint ccw, cull;
  253.     GLenum face;
  254.  
  255.     dpy = XOpenDisplay(0);
  256.     if (!dpy) {
  257.     fprintf(stderr, "Can't connect to display \"%s\"\n", getenv("DISPLAY"));
  258.     return -1;
  259.     }
  260.  
  261.     vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributes);
  262.     if (!vi) {
  263.     fprintf(stderr, "No singlebuffered rgba visual on \"%s\"\n",
  264.         getenv("DISPLAY"));
  265.     return -1;
  266.     }
  267.  
  268.     cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual,
  269.                AllocNone);
  270.     swa.border_pixel = 0;
  271.     swa.colormap = cmap;
  272.     swa.event_mask = ExposureMask | StructureNotifyMask | KeyPressMask
  273.     | KeyReleaseMask;
  274.     window = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 10, 10,
  275.                width, height,
  276.                0, vi->depth, InputOutput, vi->visual,
  277.                CWBorderPixel|CWColormap|CWEventMask, &swa);
  278.     XSetWMColormapWindows(dpy, window, &window, 1);
  279.     XStoreName(dpy, window, "Culling test");
  280.     XMapWindow(dpy, window);
  281.     XIfEvent(dpy, &event, WaitForMapNotify, (char*)window);
  282.  
  283.     cx = glXCreateContext(dpy, vi, 0, GL_TRUE);
  284.     if (!glXMakeCurrent(dpy, window, cx)) {
  285.     fprintf(stderr, "Can't make window current to context\n");
  286.     return -1;
  287.     }
  288.  
  289.     face = GL_FRONT_AND_BACK;
  290.     ccw = 0;
  291.     cull = 0;
  292.     glPolygonMode(face, GL_FILL);
  293.     glFrontFace(GL_CW);
  294.     glCullFace(GL_FRONT);
  295.     glDisable(GL_CULL_FACE);
  296.     DisplayState();
  297.  
  298.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  299.     glPointSize(4.0);
  300.     glEnable(GL_POINT_SMOOTH);
  301.  
  302.     needDisplay = GL_TRUE;
  303.     for (;;) {
  304.     do {
  305.         XNextEvent(dpy, &event);
  306.         switch (event.type) {
  307.           case Expose:
  308.         needDisplay = GL_TRUE;
  309.         break;
  310.           case ConfigureNotify:
  311.         width = event.xconfigure.width;
  312.         height = event.xconfigure.height;
  313.         needDisplay = GL_TRUE;
  314.         break;
  315.           case KeyPress:
  316.         {
  317.             char buf[100];
  318.             int rv;
  319.             KeySym ks;
  320.  
  321.             rv = XLookupString(&event.xkey, buf, sizeof(buf), &ks, 0);
  322.             switch (ks) {
  323.               case XK_0: face = GL_FRONT; break;
  324.               case XK_1: face = GL_BACK; break;
  325.               case XK_2: face = GL_FRONT_AND_BACK; break;
  326.               case XK_p:
  327.               case XK_P:
  328.             glPolygonMode(face, GL_POINT);
  329.             needDisplay = GL_TRUE;
  330.             break;
  331.               case XK_l:
  332.               case XK_L:
  333.             glPolygonMode(face, GL_LINE);
  334.             needDisplay = GL_TRUE;
  335.             break;
  336.               case XK_f:
  337.               case XK_F:
  338.             glPolygonMode(face, GL_FILL);
  339.             needDisplay = GL_TRUE;
  340.             break;
  341.               case XK_d:
  342.               case XK_D:
  343.             ccw = !ccw;
  344.             glFrontFace(ccw ? GL_CCW : GL_CW);
  345.             needDisplay = GL_TRUE;
  346.             break;
  347.               case XK_c:
  348.               case XK_C:
  349.             if (face != GL_FRONT_AND_BACK) {
  350.                 glCullFace(face);
  351.                 needDisplay = GL_TRUE;
  352.             }
  353.             break;
  354.               case XK_e:
  355.               case XK_E:
  356.             cull = !cull;
  357.             if (cull) {
  358.                 glEnable(GL_CULL_FACE);
  359.             } else {
  360.                 glDisable(GL_CULL_FACE);
  361.             }
  362.             needDisplay = GL_TRUE;
  363.             break;
  364.               case XK_Escape:
  365.             return 0;
  366.             }
  367.         }
  368.         break;
  369.         }
  370.     } while (XPending(dpy) != 0);
  371.  
  372.     if (needDisplay) {
  373.         needDisplay = GL_FALSE;
  374.         DisplayState();
  375.         DoDisplay();
  376.     }
  377.     }
  378. }
  379.